package AgentesClassificadores;

import jade.core.behaviours.CyclicBehaviour;
import jade.domain.DFService;
import jade.domain.FIPAException;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.lang.acl.ACLMessage;

import java.io.File;
import java.io.IOException;

import org.ini4j.Ini;
import org.ini4j.InvalidFileFormatException;

@SuppressWarnings("serial")
public class AgenteClassificadorFornecedor extends jade.core.Agent {

	private Ini ini;
	private String caminhoFich = "config/classificadores/";
	private String nomeFich = "classificacoesFornecedores";
	private ClassificacaoFornecedor cfc;


	protected void setup() 
	{ 
		try {
			ini = new Ini(new File(caminhoFich + nomeFich + ".ini"));
		} catch (InvalidFileFormatException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			DFAgentDescription dfd = new DFAgentDescription();
			dfd.setName( getAID() );
			ServiceDescription sd  = new ServiceDescription();
			sd.setType( "AgenteClassificadorFornecedor" );
			sd.setName( getLocalName() );
			dfd.addServices(sd);
			DFService.register(this, dfd );  
		}
		catch (FIPAException fe) { 
			fe.printStackTrace(); 
		}


		addBehaviour(new CyclicBehaviour(this) 
		{
			public void action() 
			{
				ACLMessage msg= receive();

				if (msg!=null){
					float cl = getClassificacao(msg.getContent());
					ACLMessage reply = msg.createReply();
					reply.setContent(Float.toString(cl));
					send(reply);
				}
				block();
			}
		});


	}

	public float getClassificacao(String nomeFornecedor) {
		
		int inovacao = 1;
		int qualHistorico = 1;
		int acordosComerciais = 1;
		int cumprimentoPrazos = 1;
		try {
			inovacao = Integer.parseInt(ini.get(nomeFornecedor, "inovacao"));
			qualHistorico = Integer.parseInt(ini.get(nomeFornecedor, "qualHistorico"));
			acordosComerciais = Integer.parseInt(ini.get(nomeFornecedor, "acordosComerciais"));
			cumprimentoPrazos = Integer.parseInt(ini.get(nomeFornecedor, "cumprimentoPrazos"));
		} catch (Exception e) {
			inovacao = 1;
			qualHistorico = 1;
			acordosComerciais = 1;
			cumprimentoPrazos = 1;
		}
		

		ACLMessage msg = null;


		enviar_msg("AgenciaRating",nomeFornecedor);
		do {

			msg = this.blockingReceive();


		} while (msg == null);

		int rating = 1;
		
		try {
			rating = Integer.parseInt(msg.getContent());
		} catch (Exception e) {
			rating = 1;
		}
		cfc = new ClassificacaoFornecedor(inovacao, qualHistorico, acordosComerciais, cumprimentoPrazos,nomeFornecedor,rating);

		return cfc.getClassificacao();
	}

	private void enviar_msg(String tipo_dest, String s_msg) {

		ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
		DFAgentDescription dfd = new DFAgentDescription();
		ServiceDescription sd  = new ServiceDescription();
		sd.setType(tipo_dest);
		dfd.addServices(sd);

		DFAgentDescription[] result = {};
		try {
			result = DFService.search(this, dfd);

		} catch (FIPAException e) {
			e.printStackTrace();
		}

		for (DFAgentDescription df : result) {
			msg.addReceiver(df.getName());
		}

		msg.setContent(s_msg);
		send(msg);

	}
}
